package com.zp.self.module.level_4_算法练习.数据结构.数组;

/**
 * @author By ZengPeng
 */
public class 力扣_303_区域和检索数组不可变 {
    //测试
    public static void main(String[] args) {


         // Your NumArray object will be instantiated and called as such:
        NumArray obj = new NumArray(new int[]{-2, 0, 3, -5, 2, -1});
        System.out.println(obj.sumRange(0, 2));
        System.out.println(obj.sumRange(2, 5));
        System.out.println(obj.sumRange(0, 5));
    }

    /**
     * 题目：给定一个整数数组 nums，处理以下类型的多个查询:
     *
     * 计算索引left和right（包含 left 和 right）之间的 nums 元素的 和 ，其中left <= right
     * 实现 NumArray 类：
     *
     * NumArray(int[] nums) 使用数组 nums 初始化对象
     * int sumRange(int i, int j) 返回数组 nums中索引left和right之间的元素的 总和 ，包含left和right两点（也就是nums[left] + nums[left + 1] + ... + nums[right])
     *
     * 示例 1：
     * 输入：
     * ["NumArray", "sumRange", "sumRange", "sumRange"]
     * [[[-2, 0, 3, -5, 2, -1]], [0, 2], [2, 5], [0, 5]]
     * 输出：
     * [null, 1, -1, -3]
     *
     * 解释：
     * NumArray numArray = new NumArray([-2, 0, 3, -5, 2, -1]);
     * numArray.sumRange(0, 2); // return 1 ((-2) + 0 + 3)
     * numArray.sumRange(2, 5); // return -1 (3 + (-5) + 2 + (-1))
     * numArray.sumRange(0, 5); // return -3 ((-2) + 0 + 3 + (-5) + 2 + (-1))
     *
     * 分析：
     *      1.常规解法：使用数组循环
     *      大神解法：事先将和求出来保存
     *      通过求出每一位 到第0位的和 ，[left,right] = sum(ringt)-sum(left-1);
     *
     * 边界值 & 注意点：
     *      1.
     **/
}
class NumArray {

    int[] sums ;
    public NumArray(int[] nums) {
        sums = new int[nums.length];
        if (nums.length == 0) {
            return;
        }
        int sum = 0;
        for (int i = 0; i < nums.length; i++) {
            sum+=nums[i];
            sums[i] = sum;
        }
    }

    public int sumRange(int left, int right) {
        if(left==0) return sums[right];
        return sums[right] - sums[left-1];
    }
}